package cn.tedu.straw.api.service.impl;

import cn.tedu.straw.api.dto.PostCommentDTO;
import cn.tedu.straw.api.ex.AccessDeniedException;
import cn.tedu.straw.api.ex.CommentNotFoundException;
import cn.tedu.straw.api.ex.DeleteException;
import cn.tedu.straw.api.ex.InsertException;
import cn.tedu.straw.api.mapper.CommentMapper;
import cn.tedu.straw.api.service.ICommentService;
import cn.tedu.straw.commons.model.Comment;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author tedu.cn
 * @since 2020-08-11
 */
@Service
public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> implements ICommentService {

    @Autowired
    private CommentMapper commentMapper;

    @Override
    public Comment post(PostCommentDTO postCommentDTO, Integer userId, String userNickName) {
        Comment comment = new Comment()
                .setAnswerId(postCommentDTO.getAnswerId())
                .setContent(postCommentDTO.getContent())
                .setUserId(userId)
                .setUserNickName(userNickName)
                .setCreatedTime(LocalDateTime.now());
        int rows = commentMapper.insert(comment);
        if (rows != 1) {
            throw new InsertException("发表评论失败！服务器忙，请稍后再次尝试！");
        }
        return comment;
    }

    @Override
    public Comment delete(Integer commentId, Integer userId) {
        // 基于参数commentId调用commentMapper.selectById()查询数据
        Comment result = commentMapper.selectById(commentId);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出CommentNotFoundException
            throw new CommentNotFoundException("删除评论失败！尝试访问的数据不存在！");
        }

        // 判断查询结果中的userId与当前登录的用户的id是否不相同（使用equals()对比，不要使用==或!=符号）
        // 判断Integer数据时，如果数据在 [-128, 127] 区间内，使用==或equals()判断均可，如果超出该区间，必须使用equals()来判断
        // 因为Java在运行时，会创建 [-128, 127] 区间里所有的值作为常量（程序刚启动就有这256个常量值）
        // 当使用 Integer i = 1; 类似语法时，会直接引用常量池中的常量
        // 当使用的值超出 [-128, 127] 区间时，会在堆内存中创建数据的对象
        // 使用==或!=判断时，判断的就是内存地址，常量是唯一的，所以多个变量的引用地址相同，堆中的对象都是新创建的，则引用地址不同
        if (!result.getUserId().equals(userId)) {
            // 是：抛出AccessDeniedException（注意导包不要出错）
            throw new AccessDeniedException("删除评论失败！不允许删除他人的数据！");
        }

        // 基于参数commentId调用commentMapper.deleteById()删除数据
        int rows = commentMapper.deleteById(commentId);
        // 判断删除操作的返回值是否不为1
        if (rows != 1) {
            // 是：抛出DeleteException
            throw new DeleteException("删除评论失败！服务器忙，请稍后再次尝试！");
        }

        // 返回此前的查询结果
        return result;
    }

}
